
package concoursbelote;
import java.util.ArrayList;

import java.util.ArrayList;
import java.util.Scanner;

/**
 *
 * @author Shehu
 */
public class Belote 
{
    
    public static ArrayList<Client> joueursDeBelote = new ArrayList<Client>();
    //ClientJoueur joueursDeBelote[] = new ClientJoueur [4];
    int reponse =-1;
    int prend = 4 ; // Variable pour savoir quel joueur prend 
    String atoutDuJeu = null ; //Couleur de l'atout 
    
    int donne =0;
    int tmp=0;
    int gagne =0;
    int nombreJoueur =0;
    boolean mancheJouee;
    Carte carteRetournee;
    String carteJouee= null;
    PliBelote lePli = new PliBelote();
    String couleurJouee = null ;
    String choixAtout = null ;
    PaquetdeCartes lePaquet = new PaquetdeCartes();
    Carte joue = null ;
    int laCoupe ;
    
    public Belote ()
    {
           System.out.println("Choisissez les 4 joueurs pour la partie de belote");
           for (int i = 0; i < Administration.currentBar.clients.size(); i++)
           {
               System.out.println(Administration.currentBar.clients.get(i).getPrenom());
           }
                Scanner in = new Scanner(System.in);
                String nom = new String();
                nom = in.next();
                while(Belote.joueursDeBelote.size() < 4)
                {
                    for (int j = 0; j < Administration.currentBar.clients.size(); j++)
                    {
                        if(Administration.currentBar.clients.get(j).getPrenom().equalsIgnoreCase(nom))
                        {
                           Client temp = (Client) Administration.currentBar.clients.get(j);
                           Belote.joueursDeBelote.add(temp);
                        }
                    }
                }
    }
    
    
   public void leJeu ()
    {
        lePaquet.battreLesCartes();
        
        tmp=donne;
        nombreJoueur=0;
        while (nombreJoueur != 4) // Partage des trois premières cartes 
        {
            tmp++;
            if (tmp >3 )
                tmp=0;
            lePaquet.distribuerLesCartes(Belote.joueursDeBelote.get(tmp), 3);
            nombreJoueur++;
        }
        
        // Partage des 2 cartes 
        tmp=donne;
        nombreJoueur=0;
        while (nombreJoueur !=4)
        {
            tmp++;
            if (tmp>3)
                tmp=0;
            lePaquet.distribuerLesCartes(Belote.joueursDeBelote.get(tmp), 2);
            nombreJoueur++;
        }
        carteRetournee = lePaquet.retournerLaCarte();
        
        SigneCarte couleur = carteRetournee.getCouleur();
        atoutDuJeu= couleur.getNomCouleur();
        
        // Affichage des jeux des joueurs
        for (int i=0 ; i<4 ;i++)
        {
            ((ClientJoueur)Belote.joueursDeBelote.get(i)).afficherJeuJoueur(i);
        }
        
        //Prend un 1er Tour
        
        boolean preneur = false;
        tmp=donne;
        nombreJoueur=0;
        
        while ((!preneur) && (nombreJoueur !=4))
        {
            tmp++;
            if (tmp >3)
                tmp=0;
            preneur = ((ClientJoueur)Belote.joueursDeBelote.get(tmp)).prendPremierTour(carteRetournee);
            if (preneur) 
                prend =tmp;
        }
            nombreJoueur ++;
     
    
        // Prend deuxième tour
    
    if (!preneur)
    {
        tmp=donne;
        nombreJoueur =0;
        while ((!preneur) && (nombreJoueur !=4))
        {
            tmp++;
            if (tmp >3 )
                tmp=0;
            preneur = ((ClientJoueur)Belote.joueursDeBelote.get(tmp)).prendDeuxiemeTour(carteRetournee);
            if (preneur)
            {
                prend=tmp;
                atoutDuJeu= ((ClientJoueur)Belote.joueursDeBelote.get(tmp)).choixAtout;
                preneur = true ;
            }
            nombreJoueur++;
        }
    }
        
    if (! preneur) // Pas de preneur , on remet les cartes dans le paquet 
    {
        for (int i=0 ; i<4 ;i++)
        {
            lePaquet.getPaquet().addAll(((ClientJoueur)Belote.joueursDeBelote.get(i)).mainJoueur);
            ((ClientJoueur)Belote.joueursDeBelote.get(i)).mainJoueur.clear();
        }
        lePaquet.getPaquet().add(carteRetournee.clone()); //
        carteRetournee=null;
    }
    else // Distributions du reste de cartes
    {
        tmp=donne;
        nombreJoueur=0;
        while (nombreJoueur != 4)
        {
            tmp++;
            if (tmp>3 )
                tmp=0;
            if (prend == tmp)
            {
                lePaquet.distribuerLesCartes(joueursDeBelote.get(tmp), 2);
                ((ClientJoueur)Belote.joueursDeBelote.get(tmp)).reçoitCarte(carteRetournee);
            }
            else
            {
                lePaquet.distribuerLesCartes(joueursDeBelote.get(tmp), 3);
            }
            nombreJoueur++;
        }
        // Tri de tous les jeux 
        for (int i =0 ; i<4 ; i++)
            ((ClientJoueur)Belote.joueursDeBelote.get(i)).trieSonJeu();
        
        for (int tour =0 ; tour<8 ; tour++)
        {
            if (tour==0)
                tmp= donne+1;
            else
                tmp=gagne;
            nombreJoueur=0;
            carteJouee= " ";
            
            while (nombreJoueur != 4)
            {
                if (tmp>3)
                    tmp=0;
                if (nombreJoueur==0)
                    couleurJouee =null;
                //for (int i=0 ; i< joueursDeBelote.size();i++)
                if (tmp==0)
                {
                    boolean test = false;
                    
                    //for (int i=0 ; i< joueursDeBelote.size();i++)
                    //{
                    
                        while (test != true)
                        {
                            if (couleurJouee.equalsIgnoreCase(null))
                                test = true;
                            else
                                test =ServeurArbitre.testCarteJouee(((ClientJoueur)Belote.joueursDeBelote.get(tmp)).mainJoueur, joue, couleurJouee, atoutDuJeu);

                            if (test == true )
                            {
                                joue=((ClientJoueur)Belote.joueursDeBelote.get(tmp)).mainJoueur.get(ServeurArbitre.testCarteAJouer(((ClientJoueur)Belote.joueursDeBelote.get(tmp)).mainJoueur, couleurJouee, atoutDuJeu)).clone();
                                lePli.setPli(tmp, joue);
                                
                                ((ClientJoueur)Belote.joueursDeBelote.get(tmp)).mainJoueur.remove(ServeurArbitre.testCarteAJouer(((ClientJoueur)Belote.joueursDeBelote.get(tmp)).mainJoueur, couleurJouee, atoutDuJeu));
                           }
                        }
                    //}
                }
                else
                {
                    lePli.setPli(tmp,((ClientJoueur)Belote.joueursDeBelote.get(tmp)).mainJoueur.get(ServeurArbitre.testCarteAJouer(((ClientJoueur)Belote.joueursDeBelote.get(tmp)).mainJoueur, couleurJouee, atoutDuJeu)));
                }
                if (nombreJoueur==0)
                {
                    SigneCarte signe = joue.getCouleur();
                    couleurJouee = signe.getNomCouleur();
                }
                nombreJoueur++;
                tmp++;
            }
            gagne = lePli.gagnePli(couleurJouee, atoutDuJeu, tour);
            
            try
            {
                new Thread().sleep(4000);
            }
            catch (Exception e)
            {
            }

        }
        lePli.gagnePartie();
        
        if (lePli.pointEquipeDD==0 || lePli.pointEquipeDG==0)
        {
            if (lePli.pointEquipeDD==0 )
            {
                  PliBelote.setTotalDG(PliBelote.getTotalDG()+ 250);  
            }
            else
            {
                PliBelote.setTotalDD(PliBelote.getTotalDD()+250);
            }
        }
        else
        {
            mancheJouee = ServeurArbitre.gagneManche(lePli.pointEquipeDD, lePli.pointEquipeDG, prend);
            if (mancheJouee == true)
            {
                PliBelote.setTotalDD(PliBelote.getTotalDD()+ lePli.pointEquipeDD);
                PliBelote.setTotalDG(PliBelote.getTotalDG() + lePli.pointEquipeDG);
            }
            else
            {
                if (prend ==1 ||  prend==3)
                {
                    PliBelote.setTotalDD(PliBelote.getTotalDD()+162);
                }
                else
                {
                    PliBelote.setTotalDG(PliBelote.getTotalDG()+162);
                }
            }
        }
        
        System.out.println (" Le total de l'Equipe Droite-Gauche est :"+ PliBelote.getTotalDG());
        System.out.println (" Le total de l'Equipe Devant-Derrière est :"+ PliBelote.getTotalDD());
        
        PaquetdeCartes.paquet.addAll(lePli.tas); // Restitution des cartes dans le paquet initial 
        lePli.tas.clear(); // Les cartes du pli 
        // Réinitialisation des scores
        lePli.pointEquipeDD=0;
        lePli.pointEquipeDG=0;
    }
    if (donne ==0)
    {
        
        do 
        {
            System.out.println ("Choisissez un nombre entre 0 et 31 pour la coupe ");
            Scanner in = new Scanner (System.in);
            laCoupe= in.nextInt();
        }
        while (! (laCoupe >=1 && laCoupe <=30));
        lePaquet.couperLesCartes(laCoupe);
    }
    else
        lePaquet.couperLesCartes((int) (Math.random()*29)+1);
    
    donne= ServeurArbitre.quiDonne(donne);
    
    if  (PliBelote.getTotalDG() > PliBelote.getTotalDD() )
    {
       
        System.out.println ("<L'arbitre> :L'équipe Droite-Gauche a gagné avec "+ PliBelote.getTotalDG() + "points contre "+PliBelote.getTotalDD()+"pour l'équipe adverse");
    }
    else if (PliBelote.getTotalDG() > PliBelote.getTotalDD() )
    {
        System.out.println ("<L'arbitre> : L'équipe Devant-Derrière a gagné avec "+ PliBelote.getTotalDD() +"points contre "+PliBelote.getTotalDG()+"pour l'équipe adverse");
    }
    else
        System.out.println( " <L'arbitre>: Il ya eu un jeu nul !!");
    }
        
}
    
